.NOLIST
#define equ .equ
#define EQU .equ
#define end .end
#define mse_x 8265h
#define mse_y 8266h
#define screenloop 8267h
#define ASM_IND_VALUE 80C8h
_IO_EXEC EQU 51EFh
#include "ti83asm.inc"
#include "tokens.inc"
.LIST
	.org 9327h				;start address of program
START:
	call _ClrLCDFull
	ld hl,INITTXT
	ld a,1
	ld (PENROW),a
	ld a,1
	ld (PENCOL),a
	call _vputs
	call INITMSE
	ld hl,INITCTXT
	ld a,9
	ld (PENROW),a
	ld a,1
	ld (PENCOL),a
	call _vputs
	call INITMSE
	call MOUSE
	ret	
INITMSE:
	ld b,255d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	call RECBYTE
	cp 0
	jp nz,INITMSE
	ld a,243d
	ld b,a
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,10d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,242d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	call RECBYTE
	cp 0
	jp nz,INITMSE
	ld b,232d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,03d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,230d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,243d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,40d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ld b,240d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,INITMSE
	ret
SENDBYTE:
	ld a,11d
	ld (ASM_IND_VALUE),a
	ld a,b
	call _IO_EXEC
	ret
RECBYTE:
	ld a,22d
	ld (ASM_IND_VALUE),a
	call _IO_EXEC
	ret
MOUSE:
	ld a,10d
	ld (mse_x),a
	ld a,10d
	ld (mse_y),a
MOUSE_MOVELOOP:
	call MOUSE_PUTMSE
MOUSE_GETKEY:
	ld a,0
	ld (screenloop),a
	ld b,235d
	call SENDBYTE
	call RECBYTE
	cp 250d
	jp nz,MSEERROR
	call RECBYTE
	ld d,a
	call RECBYTE
	ld c,a
	call RECBYTE
	ld b,a
	ld d,a
	cp 02d
	jp z,RCLICK
	cp 01d
	jp z,LCLICK
	ld a,c
	add a,b
	cp 0
	jp z,MOUSE_GETKEY
	ld a,c
	cp 0
	jp nz,MOVE_X
	ld a,b
	cp 0
	jp nz,MOVE_Y
	jp MOUSE_GETKEY
MOVE_X:
	ld a,d
	cp 16d
	jp m,MOUSE_LEFT
	jp MOUSE_RIGHT
MOVE_Y:
	ld a,d
	cp 
MOUSE_LEFT:
	call MOUSE_PUTMSE
	ld a,(mse_x)
	dec a
	ld (mse_x),a
	jp MOUSE_MOVELOOP
MOUSE_RIGHT:
	call MOUSE_PUTMSE
	ld a,(mse_x)
	inc a
	ld (mse_x),a
	jp MOUSE_MOVELOOP
MOUSE_DOWN:
	call MOUSE_PUTMSE
	ld a,(mse_y)
	dec a
	ld (mse_y),a
	jp MOUSE_MOVELOOP
MOUSE_UP:
	call MOUSE_PUTMSE
	ld a,(mse_y)
	inc a
	ld (mse_y),a
	jp MOUSE_MOVELOOP
MOUSE_PUTMSE:
	ld a,0
	ld (screenloop),a
	ld a,(mse_y)
	ld e,a
	ld a,(mse_x)
	ld bc,MSESPRT
	call SPRXOR
	call _grbufcpy_v
	ret
LCLICK:
	ld e,1
	ret
RCLICK:
	ld e,2
	ret
MSESPRT:
	.db %01000000
	.db %01100000
	.db %01110000
	.db %01111000
	.db %01111100
	.db %01111000
	.db %01111100
	.db %01011000
;
;*****************************
;*   Movax' Sprite Routine   *
;*****************************
;
SPRXOR:
	push bc
	ld hl,0
	ld d,0
	add hl,de
	add hl,de
	add hl,de
	add hl,hl
	add hl,hl
	ld d,0
	ld e,a
	srl e
	srl e
	srl e
	add hl,de
	ld de,8e29h
	add hl,de
	ld b,00000111b
	and b
	cp 0
	jp z,ALIGN
	pop ix
	ld d,a
	ld e,8
LILOP:
	ld b,(ix+0)
	ld c,0
	push de
SHLOP:
	srl b
	rr c
	dec d
	jp nz,SHLOP
	pop de
	ld a,b
	xor (hl)
	ld (hl),a
	inc hl
	ld a,c
	xor (hl)
	ld (hl),a
	ld bc,11
	add hl,bc
	inc ix
	dec e
	jp nz,LILOP
	jp DONE1
ALIGN:
	pop de
	ld b,8
ALOP1:
	ld a,(de)
	xor (hl)
	ld (hl),a
	inc de
	push bc
	ld bc,12
	add hl,bc
	pop bc
	djnz ALOP1
DONE1:
	ret
MSEERROR:
	call _ClrLCDFull
	ld hl,ERRORTXT
	ld a,1
	ld (PENROW),a
	ld a,1
	ld (PENCOL),a
	call _vputs
	ret
INITTXT:
	.db "Initializing...",0
INITCTXT:
	.db "Initialization Complete!",0
ERRORTXT:
	.db "Connection Error",0